package ar.edu.phm.tp.cuatro.planificacionDsl.validation

import org.eclipse.xtext.validation.Check
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.Dia
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.Asignacion
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.PlanificacionPackage

class DiaValidator extends AbstractPlanificacionValidator {
	public static val ASIGNACION_A_AULA_RESERVADA = "ASIGNACION_A_AULA_RESERVADA"

	@Check
	def aulasSuperpuestas(Asignacion asignacion) {
		val dia = asignacion.eContainer as Dia
		if (!asignacion.asignacionSuperpuesta(dia).empty)
			error('No se puede asignar una materia a un aula ocupada', asignacion,
				PlanificacionPackage.Literals.ASIGNACION__AULA, ASIGNACION_A_AULA_RESERVADA)
	}

	def asignacionSuperpuesta(Asignacion asignacion, Dia dia) {
		dia.asignaciones.filter[ asig |
			asig != asignacion && asig.aula == asignacion.aula &&
				esHorarioSuperpuesto(asig.horaInicio, asig.horaFin, asignacion.horaInicio, asignacion.horaFin)
		]
	}

	def boolean esHorarioSuperpuesto(int start1, int end1, int start2, int end2) {
			( start1 >= start2 && start1 <= end2 ) || ( end1 >= start2 && end1 <= end2 ) ||
			( start1 <= start2 && end1 >= end2 )
	}
}
